package cn.wolfcode.rbac.exception;

import cn.wolfcode.rbac.util.JsonResult;
import com.alibaba.fastjson.JSON;
import org.apache.shiro.authz.UnauthorizedException;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.method.HandlerMethod;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@ControllerAdvice   // 对控制器的增强处理
public class CRMExceptionHandler {

    @ExceptionHandler(RuntimeException.class)   // 捕获处理运行时出现的异常
    public String handleException(Exception ex, Model model, HandlerMethod handlerMethod, HttpServletResponse response) throws ServletException, IOException {
        // 把异常信息打印出，方便我们开发的时候找 bug
        ex.printStackTrace();
        // 判断当前执行的方法是否是 ajax的方法
        if(handlerMethod.hasMethodAnnotation(ResponseBody.class)){
            JsonResult jsonResult = new JsonResult(false, "操作失败，请联系管理员！");
            // 自己处理，response 用 流 输出去。用 new ModelAndView() 也可以。
            response.setContentType("application/json;charset=UTF-8");
            response.getWriter().print(JSON.toJSONString(jsonResult));
            return null;
        }
        // 不是，则 返回 错误视图
        model.addAttribute("ex", ex);
        return "common/error";   // 异常出现后，跳转错误视图（为了让用户体验更好，而不是 我们看的 500 、400等的错误）
    }

    @ExceptionHandler(UnauthorizedException.class)   // 捕获处理无权限的异常
    public String handleUnauthorizedException(Exception ex, Model model, HandlerMethod handlerMethod, HttpServletResponse response) throws ServletException, IOException {
        // 把异常信息打印出，方便我们开发的时候找 bug
        ex.printStackTrace();
        // 判断当前执行的方法是否是 ajax的方法
        if(handlerMethod.hasMethodAnnotation(ResponseBody.class)){
            JsonResult jsonResult = new JsonResult(false, "操作失败，您没有权限！");
            // 自己处理，response 用 流 输出去。用 new ModelAndView() 也可以。
            response.setContentType("application/json;charset=UTF-8");
            response.getWriter().print(JSON.toJSONString(jsonResult));
            return null;
        }
        // 不是，则 返回 错误视图
        model.addAttribute("ex", ex);
        return "common/nopermission";   // 异常出现后，跳转错误视图（为了让用户体验更好，而不是 我们看的 500 、400等的错误）
    }
}
